home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / paolib / cdp / cdp.c next >
Text File  |  1991-10-18  |  19KB  |  643 lines

  1. /* << High C V1.4 >> **********************************************************
  2. **
  3. **    CD簡易演奏ライブラリ
  4. **
  5. **    1991.02.09 : CREATE
  6. **    1991.02.13 : FINISH
  7. **
  8. **    < HISTORY >
  9. **    1991.02.09 : CREATE
  10. **    1991.02.19 : SHUFFLE機能の追加.
  11. **    1991.05.30 : 清書
  12. **
  13. **    < note > : TABS = 4
  14. **
  15. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  16. **
  17. ******************************************************************************/
  18.  
  19. pragma    Off (Floating_point) ;
  20.  
  21. #define    _CDP_LIB
  22.  
  23. #include <cdr.h>
  24. #include <string.h>
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <time.h>
  28. #include "cdp.h"
  29.  
  30. char    *COPYRIGHT = "CDP LIBRARY v0.50 1991.05.30  Programmed by Y.Hirata 1991. " ;
  31.  
  32. static char    CDP_FLG_init    = CDP_FALSE ;    /*  初期化処理をしたか?        */
  33. static char    CDP_FLG_tocread = CDP_FALSE ;    /*  TOC情報を取得しているか?    */
  34. static char    CDP_FLG_pause   = CDP_FALSE ;    /*  一時停止中か?                */
  35. static char    CDP_FLG_change  = CDP_FALSE ;    /*  CDの入れ換えがあったか?    */
  36. static char    CDP_FLG_shuffle = CDP_FALSE ;    /*  シャッフルの指定があったか?        */
  37.  
  38. static char    Shuffle[CDP_MAX_TRACK] ;        /*  シャッフル用演奏曲番号格納        */
  39. static char    Shuffle_cnt ;                    /*  シャッフル用何曲演奏したか        */
  40.  
  41. /******************************  各種情報初期化  *****************************/
  42. void CDP_init( void )
  43. /*=============================================================================
  44. **    演奏情報を初期化する.
  45. **
  46. **    < INPUT  > : なし
  47. **    < OUTPUT > : なし
  48. **    < RETURN > : なし
  49. **
  50. **    当ライブラリ内では必ず最初にこの関数をCALLして下さい.
  51. =============================================================================*/
  52. {
  53.     static char    valflg = CDP_FALSE ;
  54.  
  55.     if ( !valflg ) {
  56.         CDP_RANDINIT ;                            /*  乱数初期化                */
  57.         CDP_INFO_buf.drv = 0 ;                    /*  FMTOWNS CDドライブ番号    */
  58.         CDP_REP_cnt   = CDP_MIN_REPEAT ;        /*  リピート回数                */
  59.         CDP_NOW_start = CDP_MIN_TRACK ;
  60.         CDP_NOW_end   = CDP_MAX_TRACK ;
  61.         valflg = CDP_TRUE ;
  62.     }
  63.     CDP_NOW_status    = CDP_STAT_NOTREADY ;
  64.     CDP_NOW_musicno   = CDP_ZERO ;
  65.     CDP_FLG_tocread   = CDP_FALSE ;
  66.     CDP_FLG_change    = CDP_FALSE ;
  67.     CDP_FLG_pause     = CDP_FALSE ;
  68.     CDP_FLG_pauseplay = CDP_FALSE ;
  69.     CDP_FLG_shuffleinit = CDP_TRUE ;
  70.  
  71.     CDP_FLG_init      = CDP_TRUE ;
  72. }
  73.  
  74. /******************************  CD情報の取得  *****************************/
  75. int CDP_cdinfo( void )
  76. /*=============================================================================
  77. **    CD情報取得命令を発行する.
  78. **
  79. **    < INPUT  > : なし
  80. **    < OUTPUT > : なし
  81. **    < RETURN > : エラー値
  82. **
  83. **    この関数にてCD情報を取得する際には、必ず数回のリトライを行って下さい.
  84. =============================================================================*/
  85. {
  86.     if ( !CDP_FLG_init ) CDP_init() ;
  87.  
  88.     return(
  89.         cdr_cdinfo(
  90.             CDP_INFO_buf.drv,&CDP_INFO_buf.type,
  91.             &CDP_INFO_buf.start,&CDP_INFO_buf.end,
  92.             (char *)CDP_INFO_buf.track,(char *)&CDP_INFO_buf.discend
  93.         )
  94.     ) ;
  95. }
  96.  
  97. /****************************  TOC情報の取得  *****************************/
  98. int CDP_tocread( void )
  99. /*=============================================================================
  100. **    TOC情報を取得する.
  101. **
  102. **    < INPUT  > : なし
  103. **    < OUTPUT > : なし
  104. **    < RETURN > : = 偽 - TOC 読み込み成功(エラーなし)
  105. **                   真 - TOC 読み込み失敗(エラーあり)
  106. =============================================================================*/
  107. {
  108.     int        errcnt, ret ;
  109.  
  110. /*
  111. **    共通フラグの初期化
  112. */
  113.     CDP_init() ;
  114.     CDP_NOW_start = CDP_MIN_TRACK ;
  115.     CDP_NOW_end   = CDP_MAX_TRACK ;
  116.  
  117. /*
  118. **    TOC 読み込み
  119. */
  120.     errcnt = CDP_ZERO ;
  121.     do {
  122.         ret = CDP_cdinfo() ;
  123.         cdr_pause( CDP_INFO_buf.drv ) ;
  124.         errcnt++ ;
  125.     } while ( ret && errcnt<=CDP_RETRY ) ;
  126.  
  127.     if ( errcnt > CDP_RETRY ) {                        /*  TOC 読み込み失敗!    */
  128.         return( CDP_ERR_NOTREADY ) ;
  129.     } else {                                        /*  TOC 読み込み成功♪    */
  130.         CDP_FLG_tocread = CDP_TRUE ;
  131.         CDP_NOW_status  = CDP_STAT_STOP ;
  132.         CDP_timecalc() ;
  133.         return( CDP_ERR_NOERROR ) ;
  134.     }
  135. }
  136.  
  137. /********************************  CD演奏  *********************************/
  138. int CDP_mtrplay( void )
  139. /*=============================================================================
  140. **    CD演奏命令を発行する.
  141. **
  142. **    < INPUT  > : なし
  143. **    < OUTPUT > : なし
  144. **    < RETURN > : エラー値
  145. **
  146. **    CDP_CLOCK_start および CDP_CLOCK_end を設定してからこの関数をCALLする
  147. **    こと.
  148. =============================================================================*/
  149. {
  150.     if ( !CDP_FLG_init ) CDP_init() ;
  151.  
  152.     if ( CDP_REP_cnt < CDP_MIN_REPEAT || CDP_REP_cnt > CDP_MAX_REPEAT )
  153.         return( CDP_ERR_PARAMETER ) ;
  154.  
  155.     return(
  156.         cdr_mtrplay(
  157.             CDP_INFO_buf.drv,
  158.             (char *)&CDP_CLOCK_start,(char *)&CDP_CLOCK_end,
  159.             CDP_REP_cnt
  160.         )
  161.     ) ;
  162. }
  163.  
  164. /***************************  CD演奏状態の取得  ****************************/
  165. int CDP_mphase( void )
  166. /*=============================================================================
  167. **    CD演奏状態取得命令を発行する.
  168. **
  169. **    < INPUT  > : なし
  170. **    < OUTPUT > : なし
  171. **    < RETURN > : エラー値
  172. =============================================================================*/
  173. {
  174.     if ( !CDP_FLG_init ) CDP_init() ;
  175.  
  176.     return(
  177.         cdr_mphase(
  178.             CDP_INFO_buf.drv,&CDP_NOW_status,&CDP_NOW_musicno,
  179.             (char *)&CDP_CLOCK_nowtrack,(char *)&CDP_CLOCK_nowdisc
  180.         )
  181.     ) ;
  182. }
  183.  
  184. /**************************  CDの現在の状態を取得  *************************/
  185. int CDP_status( void )
  186. /*=============================================================================
  187. **    演奏状態の取得とチェックを行う.
  188. **
  189. **    < INPUT  > : なし
  190. **    < OUTPUT > : なし
  191. **    < RETURN > : エラー値
  192. **
  193. **    この関数を続けてCALLする場合には、100ms以上待ち時間をおいて下さい.
  194. **    (この関数に限ったことではないのだが・・・・・)
  195. **    たてつづけにCALLすると、演奏中の場合には、音飛びなどの原因となります.
  196. **    何故なんだろう?困ったもんだ・・・
  197. **
  198. **    この関数は、毎秒2~3回CALLするようにして下さい. そうしないと、演奏モード
  199. **    のとおりに演奏されません. また、演奏時間も保証されません.
  200. =============================================================================*/
  201. {
  202.     int        ret ;
  203.     int        status ;                    /*  現在のCD演奏状態                */
  204.     int        musicno ;                    /*  現在演奏中の曲番号                */
  205.     CDP_TRACK    nowdisc ;                /*  演奏中のディスク内演奏時間            */
  206.     CDP_TRACK    nowtrack ;                /*  演奏中のトラック内演奏時間            */
  207.  
  208.     if ( !CDP_FLG_init ) CDP_init() ;
  209.  
  210.     CDP_FLG_change = CDP_FALSE ;
  211.  
  212.     status = CDP_NOW_status ;
  213.     musicno = CDP_NOW_musicno ;
  214.     memcpy( (char *)&nowdisc,(char *)&CDP_CLOCK_nowdisc,
  215.             sizeof( CDP_TRACK ) ) ;
  216.     memcpy( (char *)&nowtrack,(char *)&CDP_CLOCK_nowtrack,
  217.             sizeof( CDP_TRACK ) ) ;
  218.  
  219.     ret = CDP_mphase() ;
  220.     if ( ret == CDP_ERR_CHANGE ) {                    /*  CD が入れ換えられた    */
  221.         CDP_FLG_change  = CDP_TRUE ;
  222.         CDP_FLG_tocread = CDP_FALSE ;
  223.         ret = CDP_mphase() ;
  224.     }
  225.     if ( !ret ) {
  226.         if ( CDP_NOW_status ) {                        /*  演奏中                */
  227.             CDP_NOW_status = CDP_STAT_PLAY ;
  228.             CDP_remaintime() ;                            /*  残り時間取得    */
  229.         } else {                                    /*  停止中 or PAUSE中    */
  230.             if ( CDP_FLG_pause ) {                        /*  一時停止中        */
  231.                 CDP_NOW_status  = CDP_STAT_PAUSE ;
  232.                 CDP_NOW_musicno = musicno ;
  233.                 memcpy( (char *)&CDP_CLOCK_nowdisc,(char *)&nowdisc,
  234.                         sizeof( CDP_TRACK ) ) ;
  235.                 memcpy( (char *)&CDP_CLOCK_nowtrack,(char *)&nowtrack,
  236.                         sizeof( CDP_TRACK ) ) ;
  237.             } else {                                    /*  停止中            */
  238.                 CDP_NOW_status  = CDP_STAT_STOP ;
  239.                 CDP_NOW_musicno = CDP_ZERO ;
  240.                 CDP_CLOCK_nowdisc.min    = CDP_ZERO ;
  241.                 CDP_CLOCK_nowdisc.sec    = CDP_ZERO ;
  242.                 CDP_CLOCK_nowdisc.frame  = CDP_ZERO ;
  243.                 CDP_CLOCK_nowtrack.min   = CDP_ZERO ;
  244.                 CDP_CLOCK_nowtrack.sec   = CDP_ZERO ;
  245.                 CDP_CLOCK_nowtrack.frame = CDP_ZERO ;
  246. /*
  247. **    残り時間
  248. */
  249.                 CDP_remaintime() ;
  250.             }
  251.         }
  252.         if ( CDP_FLG_change ) return( CDP_ERR_CHANGE ) ;
  253.         return( CDP_ERR_NOERROR ) ;
  254.     } else {
  255.         CDP_NOW_status = CDP_STAT_NOTREADY ;
  256.         return( ret ) ;
  257.     }
  258. }
  259.  
  260. /****************************  時間指定演奏処理  *****************************/
  261. int CDP_timeplay( void )
  262. /*=============================================================================
  263. **    指定された時間の範囲内を演奏する.
  264. **
  265. **    < INPUT  > : なし
  266. **    < OUTPUT > : なし
  267. **    < RETURN > : エラー値
  268. **
  269. **    CDP_CLOCK_start および CDP_CLOCK_end を設定してからこの関数をCALLする
  270. **    こと.
  271. =============================================================================*/
  272. {
  273.     int        errcnt ;
  274.  
  275.     if ( !CDP_FLG_init ) CDP_init() ;
  276.  
  277.     if ( CDP_FLG_pause && !CDP_FLG_pauseplay ) return( CDP_ERR_NOWPAUSE ) ;
  278.     if ( !CDP_FLG_tocread ) return( CDP_ERR_NOTREADY ) ;
  279.  
  280.     errcnt = 0 ;
  281.     do {
  282.         if ( cdr_pause( CDP_INFO_buf.drv ) == CDP_ERR_CHANGE ) {
  283.             CDP_FLG_change = CDP_TRUE ;
  284.             CDP_FLG_tocread = CDP_FALSE ;
  285.             return( CDP_ERR_CHANGE ) ;
  286.         }
  287.         if ( CDP_mtrplay() == CDP_ERR_PARAMETER ) {        /*  演奏開始        */
  288.             return( CDP_ERR_PARAMETER ) ;
  289.         }
  290.         if ( CDP_mphase() ) CDP_NOW_status = CDP_STAT_NOTREADY ;
  291.         if ( ++errcnt >= CDP_RETRY ) {
  292.             return( CDP_ERR_NOTREADY ) ;
  293.         }
  294.     } while( CDP_NOW_status != CDP_STAT_PLAY ) ;
  295.  
  296.     return( CDP_status() ) ;
  297. }
  298.  
  299. /****************************  CDの演奏をします  ***************************/
  300. int CDP_play( void )
  301. /*=============================================================================
  302. **    指定された曲を演奏する.
  303. **
  304. **    < INPUT  > : なし
  305. **    < OUTPUT > : なし
  306. **    < RETURN > : エラー値
  307. **
  308. **    CDP_NOW_start および CDP_NOW_end を設定してからこの関数をCALLすること.
  309. **
  310. **    ここでは、演奏開始曲と演奏終了曲に従って演奏処理をするので、演奏中に演奏
  311. **    させない時などは、この関数を呼ぶ側で制御します.
  312. **
  313. **    時間指定による演奏などは、この関数を使用しないで、演奏開始/終了時間を設
  314. **    定後 CDP_timeplay() を CALL して下さい.
  315. =============================================================================*/
  316. {
  317.     if ( !CDP_FLG_init ) CDP_init() ;
  318. /*
  319. **    TOC 読み込み
  320. */
  321.     if ( !CDP_FLG_tocread ) {
  322.         if( CDP_tocread() ) return( CDP_ERR_NOTREADY ) ;
  323.     }
  324. /*
  325. **    CDDA のないコンパクトディスクには用がない!
  326. */
  327.     if ( CDP_INFO_buf.type != CDP_TYPE_CDDA &&
  328.             CDP_INFO_buf.type != CDP_TYPE_BOTH ) return( CDP_ERR_NOMUSIC ) ;
  329. /*
  330. **    演奏曲番号誤り
  331. */
  332.     if ( CDP_NOW_start < CDP_MIN_TRACK ) return( CDP_ERR_PARAMETER ) ;
  333.     if ( CDP_NOW_end > CDP_MAX_TRACK )   return( CDP_ERR_PARAMETER ) ;
  334.     if ( CDP_NOW_start > CDP_NOW_end )   return( CDP_ERR_PARAMETER ) ;
  335.     if ( CDP_NOW_start > CDP_INFO_buf.end ||
  336.             CDP_NOW_end < CDP_INFO_buf.start )
  337.         return( CDP_ERR_PARAMETER ) ;
  338. /*
  339. **    演奏時間設定
  340. */
  341.     CDP_set_time_start( CDP_NOW_start ) ;        /*  演奏開始曲データ設定    */
  342.     CDP_set_time_end( CDP_NOW_end ) ;            /*  演奏終了曲データ設定    */
  343. /*
  344. **    演奏開始
  345. */
  346.     return( CDP_timeplay() ) ;
  347. }
  348.  
  349. /*************************  CD PAUSE/CONTINUE 処理  **************************/
  350. int CDP_pause( void )
  351. /*=============================================================================
  352. **    一時停止のON/OFFを行う.
  353. **
  354. **    < INPUT  > : なし
  355. **    < OUTPUT > : なし
  356. **    < RETURN > : エラー値
  357. **
  358. **    CDP_FLG_pause をこの関数以外で操作しないこと.
  359. **    また、当ライブラリ以外でCDのPAUSEやSTOPをしないこと.
  360. =============================================================================*/
  361. {
  362.     int        ret ;
  363.  
  364.     ret = CDP_status() ;                        /*  演奏状態のチェック            */
  365.     if ( ret ) return( ret ) ;
  366.  
  367.     if ( CDP_NOW_status == CDP_STAT_PAUSE ) {            /*  PAUSE中            */
  368.         CDP_FLG_pause = CDP_FALSE ;
  369.         if ( CDP_FLG_pauseplay ) {                        /*  時間指定 PLAY    */
  370.             ret = CDP_timeplay() ;
  371.             if ( ret == CDP_ERR_CHANGE ) {                /*  CD入れ換え時    */
  372.                 CDP_FLG_change  = CDP_TRUE ;
  373.                 CDP_FLG_tocread = CDP_FALSE ;
  374.                 return( CDP_ERR_CHANGE ) ;
  375.             } else if ( ret == CDP_ERR_PARAMETER ) {    /*  パラメタエラー        */
  376.                 return( CDP_ERR_PARAMETER ) ;
  377.             }
  378.         } else {                                        /*  CONTINUE        */
  379.             if ( cdr_continue( CDP_INFO_buf.drv ) == CDP_ERR_CHANGE ) {
  380.                 CDP_FLG_change  = CDP_TRUE ;
  381.                 CDP_FLG_tocread = CDP_FALSE ;
  382.                 return( CDP_ERR_CHANGE ) ;
  383.             }
  384.         }
  385.  
  386.     } else if ( CDP_NOW_status == CDP_STAT_PLAY ) {        /*  演奏中            */
  387.         ret = CDP_status() ;
  388.         CDP_FLG_pause     = CDP_TRUE ;
  389.         CDP_FLG_pauseplay = CDP_FALSE ;
  390.         if ( ret ) return( ret ) ;
  391.         CDP_NOW_pause = CDP_NOW_musicno ;
  392.         CDP_NOW_start = CDP_NOW_musicno ;
  393.         memcpy( (char *)&CDP_CLOCK_pause,(char *)&CDP_CLOCK_nowtrack,
  394.             sizeof( CDP_TRACK ) ) ;
  395.         memcpy( (char *)&CDP_CLOCK_pausedisc,(char *)&CDP_CLOCK_nowdisc,
  396.             sizeof( CDP_TRACK ) ) ;
  397.         ret = cdr_pause( CDP_INFO_buf.drv ) ;
  398.         if ( ret ) return( ret ) ;
  399.  
  400.     } else {                                        /*  停止中 or NOT READY    */
  401.         CDP_FLG_pause     = CDP_FALSE ;
  402.         CDP_FLG_pauseplay = CDP_FALSE ;
  403.     }
  404.  
  405.     return( CDP_status() ) ;
  406. }
  407.  
  408. /****************************  CDの停止をします  ***************************/
  409. void CDP_stop( void )
  410. /*=============================================================================
  411. **    CD演奏停止命令を発行する.
  412. **
  413. **    < INPUT  > : なし
  414. **    < OUTPUT > : なし
  415. **    < RETURN > : なし
  416. =============================================================================*/
  417. {
  418.     int        errcnt, ret ;
  419.  
  420.     if ( !CDP_FLG_init ) CDP_init() ;
  421.  
  422.     errcnt = CDP_ZERO ;
  423.     do {
  424.         ret = cdr_mstop( CDP_INFO_buf.drv ) ;
  425.         errcnt++ ;
  426.     } while ( ret && errcnt<=CDP_RETRY ) ;
  427.  
  428. /*
  429. **    制御フラグクリア
  430. */
  431.     CDP_NOW_status    = CDP_STAT_STOP ;
  432.     CDP_NOW_musicno   = CDP_ZERO ;
  433.     CDP_FLG_pause     = CDP_FALSE ;
  434.     CDP_FLG_pauseplay = CDP_FALSE ;
  435. }
  436.  
  437. /******************************  シャッフルの初期化 *******************************/
  438. void CDP_shuffle_init( void )
  439. /*=============================================================================
  440. **    シャッフルのための初期化を行う.
  441. **
  442. **    < INPUT  > : なし
  443. **    < OUTPUT > : なし
  444. **    < RETURN > : なし
  445. **
  446. **    乱数の初期化は、ライブラリの初期設定で行っておく.
  447. =============================================================================*/
  448. {
  449.     int        c, cc ;                                /*  ループカウンタ                */
  450.     int        music ;                                /*  乱数取得曲番号            */
  451.     int        cnt ;                                /*  曲番号取得用(何番目か)    */
  452.     char    flg[CDP_MAX_TRACK] ;                /*  乱数取得曲番号用フラグ    */
  453.  
  454.     CDP_FLG_shuffleinit = CDP_FALSE ;            /*  シャッフル初期化フラグクリア        */
  455.  
  456.     for ( c=0; c<CDP_INFO_buf.end; c++ ) {        /*  フラグ初期化                */
  457.         flg[c] = CDP_FALSE ;
  458.     }
  459.  
  460.     for ( c=CDP_INFO_buf.end; c>0; c-- ) {
  461.         music = CDP_RANDOM( c ) + 1 ;
  462.         cnt   = 0 ;
  463.         for ( cc=0; cc<CDP_INFO_buf.end; cc++ ) {
  464.             if ( !flg[cc] ) cnt ++ ;
  465.             if ( cnt == music ) {
  466.                 flg[cc] = CDP_TRUE ;
  467.                 music = cc + 1 ;
  468.                 break ;
  469.             }
  470.         }
  471.         Shuffle[CDP_INFO_buf.end-c] = music ;        /*  曲番号格納            */
  472.     }
  473.  
  474.     Shuffle_cnt = CDP_ZERO ;                    /*  曲番号カウンタクリア            */
  475. }
  476.  
  477. /***************************  シャッフルの曲番号を返す ****************************/
  478. int CDP_shuffle( void )
  479. /*=============================================================================
  480. **    シャッフルのための曲番号を取得する.
  481. **
  482. **    < INPUT  > : なし
  483. **    < OUTPUT > : 次の演奏曲番号, 終了時は 偽値.
  484. **    < RETURN > : エラー値
  485. **
  486. **    この関数を最初に呼ぶ時には、必ず初期化フラグ(CDP_FLG_shuffleinit)を真値に
  487. **    しておくこと.
  488. =============================================================================*/
  489. {
  490.     int        c ;
  491.     int        res ;
  492.  
  493.     if ( !CDP_FLG_init ) CDP_init() ;
  494.  
  495.     if ( !CDP_FLG_tocread ) {
  496.         if ( CDP_tocread() ) return( CDP_FALSE ) ;
  497.     }
  498.  
  499.     if ( CDP_FLG_shuffleinit )                    /*  シャッフル情報初期化            */
  500.         CDP_shuffle_init() ;
  501.  
  502.     if ( Shuffle_cnt > CDP_INFO_buf.end )        /*  全ての曲を終了した        */
  503.         return( CDP_FALSE ) ;
  504.  
  505.     res = CDP_INFO_buf.end - Shuffle_cnt ;
  506.     for ( c=0; c<res; c++ ) {
  507.         Shuffle_cnt ++ ;
  508.         if ( !CDP_data_check(Shuffle[Shuffle_cnt-1]) ) {/*  音楽ならば、        */
  509.             return( Shuffle[Shuffle_cnt-1] ) ;    /*  演奏曲番号を返す        */
  510.         }
  511.     }
  512.     return( CDP_FALSE ) ;                        /*  全ての曲を終了した        */
  513. }
  514.  
  515. /***************************  シャッフル時の状態を返す ****************************/
  516. int CDP_shuffletime( void )
  517. /*=============================================================================
  518. **    シャッフル演奏時の演奏時間を取得する.
  519. **
  520. **    < INPUT  > : なし
  521. **    < OUTPUT > : なし
  522. **    < RETURN > : エラー値
  523. =============================================================================*/
  524. {
  525.     CDP_TRACK    remain ;
  526.     int        ret ;
  527.     int        c ;
  528.     int        res ;
  529.  
  530.     ret = CDP_status() ;
  531.  
  532.     if ( CDP_NOW_status != CDP_STAT_PLAY &&
  533.             CDP_NOW_status != CDP_STAT_PAUSE ) {
  534.         return( ret ) ;
  535.     }
  536.  
  537.     if ( CDP_FLG_shuffleinit )    {                /*  シャッフル情報初期化時        */
  538.         return( ret ) ;
  539.     }
  540.  
  541. /*
  542. **    現在の曲の残り時間
  543. */
  544.     CDP_addtime( 0,0,0,
  545.                 CDP_TIME_nowtrack.min,
  546.                 CDP_TIME_nowtrack.sec,
  547.                 CDP_TIME_nowtrack.frame,
  548.                 &remain.min,&remain.sec,&remain.frame ) ;
  549. /*
  550. **    シャッフルの残りの合計時間
  551. */
  552.     res = CDP_INFO_buf.end - Shuffle_cnt ;
  553.     for ( c=0; c<res; c++ ) {
  554.         if ( !CDP_data_check(Shuffle[Shuffle_cnt+c]) ) {/*  音楽ならば、        */
  555.             CDP_addtime( remain.min,remain.sec,remain.frame,
  556.                         CDP_TIME_track[Shuffle[Shuffle_cnt+c]-1].min,
  557.                         CDP_TIME_track[Shuffle[Shuffle_cnt+c]-1].sec,
  558.                         CDP_TIME_track[Shuffle[Shuffle_cnt+c]-1].frame,
  559.                         &remain.min,&remain.sec,&remain.frame ) ;
  560.         }
  561.     }
  562. /*
  563. **    トータル残り時間
  564. */
  565.     memcpy( (char *)&CDP_TIME_nowdisc,(char *)&remain,
  566.             sizeof( CDP_TRACK ) ) ;
  567. /*
  568. **    トータル経過時間
  569. */
  570.     CDP_subtime( CDP_TIME_music.min,
  571.                 CDP_TIME_music.sec,
  572.                 CDP_TIME_music.frame,
  573.                 remain.min,remain.sec,remain.frame,
  574.                 &CDP_CLOCK_nowdisc.min,
  575.                 &CDP_CLOCK_nowdisc.sec,
  576.                 &CDP_CLOCK_nowdisc.frame ) ;
  577.  
  578.     return( ret ) ;
  579. }
  580.  
  581. /*===========================================================================*/
  582.  
  583. #undef    _CDP_LIB
  584.  
  585. /*===========================================================================*/
  586.  
  587. /*******************************  デバッグ用  ********************************/
  588. void CDP_debug_dispmsg( int errno )
  589. /*=============================================================================
  590. **    デバッグ用にメッセージIDに対応したメッセージを出力する.
  591. **
  592. **    < INPUT  > : エラー値
  593. **    < OUTPUT > : なし
  594. **    < RETURN > : なし
  595. =============================================================================*/
  596. {
  597.     char    *CDP_ERR_msg[] = {
  598.             "正常終了.",                                            /*  000    */
  599.             "CDがセットされていません.",                            /*  001    */
  600.             "パラメタに誤りがあります.",                            /*  002    */
  601.             "CDドライブが接続されていません.",                    /*  004    */
  602.             "コマンドが異常終了しました.",                            /*  008    */
  603.             "メディアエラー.",                                        /*  016    */
  604.             "ハードエラー.",                                        /*  032    */
  605.             "パリティエラー.",                                        /*  064    */
  606.             "メディアが交換されてます.",                            /*  128    */
  607.             "デバイス番号に誤りがあります.",                        /*  256    */
  608.             "セクタ長が違います.",                                    /*  257    */
  609.             "音楽演奏中です.",                                        /*  258    */
  610.             "一時停止中です.",                                        /*  260    */
  611.             "一時停止状態ではありません.",                            /*  264    */
  612.             "音楽データがありません.",                                /*  272    */
  613.             "該当メッセージなし."                                    /*  003    */
  614.             } ;
  615.     char    *CDP_STATUS_msg[] = {
  616.             "CDがセットされていません.",
  617.             "停止中です.",
  618.             "演奏中です.",
  619.             "一時停止中です."
  620.             } ;
  621.     int        c, chk, no ;
  622.     int        nomsg = 15 ;
  623.  
  624.     chk = 0x0001 ;
  625.     no = 0 ;
  626.     for ( c=0; c<8; c++ ) {
  627.         if ( ((errno & 0x00ff) & chk) == chk ) no = c + 1 ;
  628.         chk <<= 1 ;
  629.     }
  630.     if ( errno > 255 ) no += 9 ;
  631.     if ( errno != 0 && no == 0 ) no = nomsg ;
  632.     if ( no < 0 || no > nomsg ) no = nomsg ;
  633.     printf( "CDP DEBUG MSG (%04xh) : %s\n",errno,CDP_ERR_msg[no] ) ;
  634.     no = CDP_NOW_status ;
  635.     if ( no < 0 ) {
  636.         no = 0 ;
  637.     } else {
  638.         no ++ ;
  639.     }
  640.     printf( "Now status (%d) : %s\n",CDP_NOW_status,CDP_STATUS_msg[no] ) ;
  641. }
  642.  
  643.